package com.firstgroup.dao;

import com.firstgroup.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 创建userDao接口,实现user实体类的操作
 * JpaRepository<T,ID> Jpa提供的一个接口,接口定义了实体的基本操作
 * T制定具体的实体类
 * ID 指定该主键字段的类型  比如说user的主键是id  那么ID就是Integer
 */
public interface userDao extends JpaRepository<User, Integer> {
    /**
     * 添加操作:petDao.save();
     *        save方法:如果没有指定id字段,直接会进行一个insert操作
     *                如果指定了id字段:
     *                数据首先会根据指定的id先去查询,如果id存在则进行一个更新操作
     * 查询操作:
     *      根据id进行查询: petDao.findById();
     *      查询的内容封装到了optional对象:get();方法活的get对象,若查寻对象不存在则返回一个空异常
     *
     *      遍历查询: petDao.findAll();返回的是一个列表集合
     *      findAll()的sort对象的方法: List<User> list=petDao.findAll(sort.by("id"));这个遍历是根据id进行的升序遍历
     *
     *      findAll()的Pageable对象: Pageable pageable=PageRequest.of(0,2,Direction.DESC,"id");
     *                              userDao.findAll(pafeable);
     *      Pageable :接口类型
     *      PageRequest:接口的实现类对象: 实现类但不能直接new,因为构造器用protect保护
     *      PageRequest类当中提供了of方法,返回本类对象,of();
     *      参数如下:
     *      page: 查询第一页  0代表第一页
     *      size:当前页显示的记录数
     *      Direction.ASC 指定升序  Direction.DESC 指定降序
     *      properties: 指定具体哪个属性进行升序降序
     *
     * 删除操作:
     *      根据id进行删除
     *      Pet pet =new Pet();
     *      pet.setId(1);
     *      petDao.delete(pet);
     *
     *      也可以这样:petDao.deleteById(3);
     *
     * 自定义查询:
     *          (1)当JpaRepository的接口不能满足我们的时候,我们就要自己创造接口
     *          在userDao接口中自定义方法
     *          比如说根据名称进行查询
     *          List<User> findByName(String name);
     *          (2)方法定义注意事项:
     *          方法的返回值必须是根据实际的需求定义: List User
     *          方法的命名必须规范  findById   以findBy固定开始
     *         （3）联合查询：
     *          根据username 和password查
     *          findByUsernameAndPassword（String username,String password）；
     *          (4)范围查询：
     *          根据id查询 在1-5之前查询user
     *          findByIdBetweenOrderById(1,5)
     *
     * JPQL查询：
     *          类似于SQL语句
     *          本质：
     *          sql：操作的关系型数据库当中的记录：  select 字段1，字段2 from 表名；
     *          jpql：操作的是java当中的实体类对象  select 子句 from entityname;
     *              书写规则：不能出现表名，只能出现类名，属性名，区分大小写
     *                      与sql一样，关键字不区分大小写（from，where等等）
     *                      不能写select *，只能写select 别名
     *          JPQL查询user列表：
     *              sql: select *from user
     *              jpql: from  com.firstgroup.domain.User(全路径)
     *
     *              @Query(value="from com.firstgroup.domain.User")
     *              List<User> loadUserList();
     *
     *              查询某个字段（封装到object数组上）
     *              @Query(value="select id，username from com.firstgroup.domain.User")直接封装到了Object上，而没有封装到User中所以用到List<Object[]>接收
     *              List<User> loadUserList();
     *              在测试类中：List<Object[]> user=userDao.loadUserList();
     *              查询某个字段（封装到实体类上）
     *               @Query(value="select new com.firstgroup.domain.User(id,username) from com.firstgroup.domain.User")
     *               List<User> loadUserList();
     *
     *数据库和表之间的关系：表和表是通过外键的关系
     * 一对多的关系： 部门员工  班级和学生
     *多对多的关系：  项目 员工（拆解为一对多）
     * 一对一的关系：一个公司一个注册地址
     *
     *
     *
     *
     *
     */
}
